node.jsのいろいろなモジュール47 – 次世代フレームワーク「koa」
koaフレームワーク
koaとは、より小さく/より表現的に/より堅牢に を目標に、Expressの開発チームよって新たに開発されているフレームワークです。 Nodev0.12で新たに導入されるgenerators/yieldの機能を利用して、ミドルウェアの仕組みや簡単なエラー処理を実現しているようです。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.9
- Node.js : v0.11.9
サンプルアプリ作成
Node v0.11.9〜をインストール
先程もいったように、koaはNodev0.12以降の新機能であるyieldを使用しているので、まずは開発版のNodeをインストールする必要があります。 Nodev0.11.9以降のNodeをインストールしていない人は、下記のようにインストールしましょう。 ここではnvmを使用してNodeをインストールするので、まずはnvmのインストールです。
% curl https://raw.github.com/creationix/nvm/master/install.sh | sh
~/.bash_profileもしくは~/.profile、zshを使っている場合は~/.zshrcに次の記述を追加します。
#nvm . ~/.nvm/nvm.sh
nvmの設定が完了したら、v0.11.9以降のNodeをインストールしましょう。
% nvm install v0.11.9 % nvm use v0.11.9 % node -v v0.11.9
サンプルアプリ用ディレクトリを作成し、npmを使用してkoaモジュールをインストールします。
% mkdir koa-sample % cd koa-sample % npm install koa
サンプルアプリの実装
koa-sampleディレクトリで下記のようなapp.jsを作成します。
var koa = require('koa'); var app = koa();
//1 app.use(function *(next){ console.log('>> one'); yield next; console.log('<< one'); }); //2 app.use(function *(next){ console.log('>> two'); yield next; console.log('<< two'); }); //3 app.use(function *(next){ console.log('>> three'); yield next; console.log('<< three'); }); //4 app.use(function *(){ console.log("set body!!"); this.body = 'Hello World'; }); app.listen(3000); [/javascript]
どんなリクエストがきても「Hello World」文字列をBODY部に設定し、3000番ポートでHTTPサーバを起動しています。 また、app.useを使用すると、expressと同じようにミドルウェアを組み込むことができます。 「function *」という見慣れない記述がありますが、これがNodeV0.12から組み込まれるyieldで、 returnのように戻り値を返すことができます。 returnと違うところは、「yieldは関数を中断し、その続きから処理を再開可能」というところです。 koaではこの仕組を利用し、app.useを呼び出した順番に処理を適用できるようになっています。 では、アプリを起動してアクセスしてみましょう。
Nodev0.11.9を使用する場合、harmonyオプションをつけて起動しなければいけません。 次のように起動し、http://localhost:3000にアクセスしてみてください。 画面にはHello Worldが表示され、コンソールには下記のようなログが出力されます。
%node --harmony app.js >> one >> two >> three set body!! << three << two << one [/bash]
上から順にapp.use内の関数がyieldまで順番に実行(1→2→3→4)され、 一番下のapp.use実行後にyieldの後のコードが実行されていきます。(3→2→1)
まとめ
ここを見ると、すでにいろいろな機能が実装されているのがわかります。 まだ開発初期段階のフレームワークですが、Nodev0.12リリース以降は大きな期待が持てそうですね。
参考サイトなど
- koa: http://koajs.com/
- Node.js 0.12 では yield が使えるのでコールバック地獄にサヨナラできる話: http://tech.nitoyon.com/ja/blog/2013/06/27/node-yield/